#ifndef _KC_HTML_READER__H_KC_2010_
#define _KC_HTML_READER__H_KC_2010_

#include <map>
#include "HtmlTree.h"
#include "../utils/FileReader.h"

namespace kc_sf
{
	class HtmlReader
	{
	public:

		HtmlReader(const std::string &filepath, int _max_errors = 1); // throws FileReader::Error jesli plik nie da sie otworzyc
		HtmlTree read(); // tworzy drzewko tagów i waliduje poprawność syntaktyczną pliku

	private:

		typedef enum
		{
			SYNTAX_E, NO_TAGS_E, NO_CLOSE_TAG_E, BAD_CLOSE_TAG_E, NO_OPEN_TAG_E, NO_COMMENT_END_E
		}
		ErrorType;

		typedef std::pair<ErrorType, std::string> ElemError; // typ błędu + element, którego dotyczy

		std::string hr_filename;
		FileReader hr_freader; // do czytania pliku
		HtmlTree hr_tree; // drzewo tagów
		std::vector<ElemError> hr_errors; // zapamiętuje wiadomości o błędach

		unsigned int hr_max_errors; // max dopuszczalna ilość błędów, zanim reader przerwie czytanie pliku

		static const std::map<ErrorType, std::string> ErrMsgs; // mapa wiadomości skojarzonych z typem błędu
		static const std::map<ErrorType, std::string> initErrMsgs();

		unsigned int findNxtTagStart(unsigned int starting_from = 0); // czyli <, zwraca pozycję w strumieniu
		unsigned int findNxtTagEnd(unsigned int starting_from = 0); // czyli >
		unsigned int findCommentEnd(unsigned int starting_from = 0); // czyli -->
	};
}

#endif // _KC_HTML_READER__H_KC_2010_
